--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/backend/test_conversation_summaries.py ec74a2651e897325b14269ae52d11b1e12f0b6e2 (ec74a265) Text, 8.82 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Unit and integration tests for lxmf_conversation_summaries."""
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations
Tff7b72import T7ee787secrets
Tff7b72import T7ee787tempfile
Tff7b72import T7ee787time
Tff7b72import T7ee787unittest
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787database Tff7b72import Te6edf3Database
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787databaseT7ee787.T7ee787provider Tff7b72import Te6edf3DatabaseProvider
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787message_handler Tff7b72import Te6edf3MessageHandler
Tff7b72def Td2a8ff_messageTb4b4b4(
Te6edf3peer_hashTb4b4b4, Te6edf3iTb4b4b4, Tff7b72*Tb4b4b4, Te6edf3stateTff7b72=Ta5d6ff"Ta5d6ffdeliveredTa5d6ff"Tb4b4b4, Te6edf3contentTff7b72=Ta5d6ff"Ta5d6ffhelloTa5d6ff"Tb4b4b4, Te6edf3titleTff7b72=Tff7b72NoneTb4b4b4, Te6edf3is_incomingTff7b72=T79c0ff1
Tb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Te6edf3secretsTff7b72.Td2a8fftoken_hexTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffsource_hashTa5d6ff"Tb4b4b4: Te6edf3peer_hash Tff7b72if Te6edf3is_incoming Tff7b72else Ta5d6ff"Ta5d6fflocalhashlocalhashlocalhashlo12Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflocalhashlocalhashlocalhashlo12Ta5d6ff"
Tff7b72if Te6edf3is_incoming
Tff7b72else Te6edf3peer_hashTb4b4b4,
Ta5d6ff"Ta5d6ffpeer_hashTa5d6ff"Tb4b4b4: Te6edf3peer_hashTb4b4b4,
Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4: Te6edf3stateTb4b4b4,
Ta5d6ff"Ta5d6ffprogressTa5d6ff"Tb4b4b4: T79c0ff1.0Tb4b4b4,
Ta5d6ff"Ta5d6ffis_incomingTa5d6ff"Tb4b4b4: Te6edf3is_incomingTb4b4b4,
Ta5d6ff"Ta5d6ffmethodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdirectTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdelivery_attemptsTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffnext_delivery_attempt_atTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fftitleTa5d6ff"Tb4b4b4: Te6edf3title Tff7b72if Te6edf3title Tff7b72is Tff7b72not Tff7b72None Tff7b72else Ta5d6fffTa5d6ff"Ta5d6fftTffd700{Te6edf3iTffd700}Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4: Te6edf3contentTb4b4b4,
Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4: Ta5d6ff"Tffd700{}Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3iTb4b4b4,
Ta5d6ff"Ta5d6ffrssiTa5d6ff"Tb4b4b4: Tff7b72-T79c0ff50Tb4b4b4,
Ta5d6ff"Ta5d6ffsnrTa5d6ff"Tb4b4b4: T79c0ff5.0Tb4b4b4,
Ta5d6ff"Ta5d6ffqualityTa5d6ff"Tb4b4b4: T79c0ff3Tb4b4b4,
Ta5d6ff"Ta5d6ffis_spamTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffreply_to_hashTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Tb4b4b4}
Tff7b72class T56d364TestConversationSummariesTb4b4b4(Te6edf3unittestTff7b72.Td2a8ffTestCaseTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffsetUpTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3DatabaseProviderTff7b72.Td2a8ff_instance Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3DatabaseProviderTff7b72.Td2a8ff_instanceTff7b72.Td2a8ffclose_allTb4b4b4(Tb4b4b4)
Te6edf3DatabaseProviderTff7b72.Td2a8ff_instance Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftmp Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffTemporaryDirectoryTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdb Tff7b72= Te6edf3DatabaseTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8fftmpTff7b72.Td2a8ffnameTffd700}Ta5d6ff/database.dbTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffinitializeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhandler Tff7b72= Te6edf3MessageHandlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdbTb4b4b4)
Tff7b72def Td2a8fftearDownTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3DatabaseProviderTff7b72.Td2a8ff_instance Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3DatabaseProviderTff7b72.Td2a8ff_instanceTff7b72.Td2a8ffclose_allTb4b4b4(Tb4b4b4)
Te6edf3DatabaseProviderTff7b72.Td2a8ff_instance Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftmpTff7b72.Td2a8ffcleanupTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_schema_creates_summaries_tableTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3row Tff7b72= Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT name FROM sqlite_master WHERE type=Ta5d6ff'Ta5d6fftableTa5d6ff'Ta5d6ff Ta5d6ff"
Ta5d6ff"Ta5d6ffAND name=Ta5d6ff'Ta5d6fflxmf_conversation_summariesTa5d6ff'Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertIsNotNoneTb4b4b4(Te6edf3rowTb4b4b4)
Tff7b72def Td2a8fftest_upsert_creates_and_updates_summaryTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3peer Tff7b72= Te6edf3secretsTff7b72.Td2a8fftoken_hexTb4b4b4(T79c0ff16Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(Te6edf3_messageTb4b4b4(Te6edf3peerTb4b4b4, T79c0ff2Tb4b4b4, Te6edf3contentTff7b72=Ta5d6ff"Ta5d6ffoldTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(Te6edf3_messageTb4b4b4(Te6edf3peerTb4b4b4, T79c0ff1Tb4b4b4, Te6edf3contentTff7b72=Ta5d6ff"Ta5d6ffnewTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3summary Tff7b72= Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT content_preview, latest_message_id FROM lxmf_conversation_summaries Ta5d6ff"
Ta5d6ff"Ta5d6ffWHERE peer_hash = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3peerTb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3summaryTb4b4b4[Ta5d6ff"Ta5d6ffcontent_previewTa5d6ff"Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffnewTa5d6ff"Tb4b4b4)
Te6edf3latest Tff7b72= Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT MAX(id) AS max_id FROM lxmf_messages WHERE peer_hash = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3peerTb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3summaryTb4b4b4[Ta5d6ff"Ta5d6fflatest_message_idTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3latestTb4b4b4[Ta5d6ff"Ta5d6ffmax_idTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72def Td2a8fftest_failed_state_updates_failed_countTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3peer Tff7b72= Te6edf3secretsTff7b72.Td2a8fftoken_hexTb4b4b4(T79c0ff16Tb4b4b4)
Te6edf3first Tff7b72= Te6edf3_messageTb4b4b4(Te6edf3peerTb4b4b4, T79c0ff2Tb4b4b4, Te6edf3stateTff7b72=Ta5d6ff"Ta5d6fffailedTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(Te6edf3firstTb4b4b4)
Te6edf3second Tff7b72= Te6edf3_messageTb4b4b4(Te6edf3peerTb4b4b4, T79c0ff1Tb4b4b4, Te6edf3stateTff7b72=Ta5d6ff"Ta5d6ffdeliveredTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(Te6edf3secondTb4b4b4)
Te6edf3summary Tff7b72= Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT failed_count, state FROM lxmf_conversation_summaries WHERE peer_hash = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3peerTb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3summaryTb4b4b4[Ta5d6ff"Ta5d6fffailed_countTa5d6ff"Tb4b4b4]Tb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3summaryTb4b4b4[Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffdeliveredTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupdate_lxmf_message_stateTb4b4b4(
Te6edf3secondTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6fffailedTa5d6ff"Tb4b4b4,
T79c0ff0.0Tb4b4b4,
T79c0ff2Tb4b4b4,
Tff7b72NoneTb4b4b4,
Tb4b4b4)
Te6edf3summary Tff7b72= Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT failed_count, state FROM lxmf_conversation_summaries WHERE peer_hash = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3peerTb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3summaryTb4b4b4[Ta5d6ff"Ta5d6fffailed_countTa5d6ff"Tb4b4b4]Tb4b4b4, T79c0ff2Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3summaryTb4b4b4[Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6fffailedTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_delete_last_message_removes_summaryTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3peer Tff7b72= Te6edf3secretsTff7b72.Td2a8fftoken_hexTb4b4b4(T79c0ff16Tb4b4b4)
Te6edf3msg Tff7b72= Te6edf3_messageTb4b4b4(Te6edf3peerTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffdelete_lxmf_message_by_hashTb4b4b4(Te6edf3msgTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3summary Tff7b72= Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT 1 AS ok FROM lxmf_conversation_summaries WHERE peer_hash = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3peerTb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertIsNoneTb4b4b4(Te6edf3summaryTb4b4b4)
Tff7b72def Td2a8fftest_delete_one_of_many_keeps_previous_latestTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3peer Tff7b72= Te6edf3secretsTff7b72.Td2a8fftoken_hexTb4b4b4(T79c0ff16Tb4b4b4)
Te6edf3older Tff7b72= Te6edf3_messageTb4b4b4(Te6edf3peerTb4b4b4, T79c0ff2Tb4b4b4, Te6edf3contentTff7b72=Ta5d6ff"Ta5d6ffolderTa5d6ff"Tb4b4b4)
Te6edf3newer Tff7b72= Te6edf3_messageTb4b4b4(Te6edf3peerTb4b4b4, T79c0ff1Tb4b4b4, Te6edf3contentTff7b72=Ta5d6ff"Ta5d6ffnewerTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(Te6edf3olderTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(Te6edf3newerTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffdelete_lxmf_message_by_hashTb4b4b4(Te6edf3newerTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3summary Tff7b72= Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT content_preview FROM lxmf_conversation_summaries WHERE peer_hash = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3peerTb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3summaryTb4b4b4[Ta5d6ff"Ta5d6ffcontent_previewTa5d6ff"Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffolderTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_delete_conversation_removes_summaryTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3peer Tff7b72= Te6edf3secretsTff7b72.Td2a8fftoken_hexTb4b4b4(T79c0ff16Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(Te6edf3_messageTb4b4b4(Te6edf3peerTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8ffdelete_conversationTb4b4b4(Ta5d6ff"Ta5d6fflocalTa5d6ff"Tb4b4b4, Te6edf3peerTb4b4b4)
Te6edf3summary Tff7b72= Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT 1 AS ok FROM lxmf_conversation_summaries WHERE peer_hash = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3peerTb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertIsNoneTb4b4b4(Te6edf3summaryTb4b4b4)
Tff7b72def Td2a8fftest_rebuild_after_empty_summary_tableTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3peer Tff7b72= Te6edf3secretsTff7b72.Td2a8fftoken_hexTb4b4b4(T79c0ff16Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(Te6edf3_messageTb4b4b4(Te6edf3peerTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3contentTff7b72=Ta5d6ff"Ta5d6ffkeptTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffDELETE FROM lxmf_conversation_summariesTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffrefresh_conversation_summaryTb4b4b4(Te6edf3peerTb4b4b4)
Te6edf3summary Tff7b72= Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT content_preview FROM lxmf_conversation_summaries WHERE peer_hash = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3peerTb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3summaryTb4b4b4[Ta5d6ff"Ta5d6ffcontent_previewTa5d6ff"Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffkeptTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_get_conversations_reads_summaries_without_fieldsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3peer_a Tff7b72= Te6edf3secretsTff7b72.Td2a8fftoken_hexTb4b4b4(T79c0ff16Tb4b4b4)
Te6edf3peer_b Tff7b72= Te6edf3secretsTff7b72.Td2a8fftoken_hexTb4b4b4(T79c0ff16Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(Te6edf3_messageTb4b4b4(Te6edf3peer_aTb4b4b4, T79c0ff1Tb4b4b4, Te6edf3contentTff7b72=Ta5d6ff"Ta5d6ffalphaTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(Te6edf3_messageTb4b4b4(Te6edf3peer_bTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3contentTff7b72=Ta5d6ff"Ta5d6ffbetaTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3rows Tff7b72= Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8ffget_conversationsTb4b4b4(Ta5d6ff"Ta5d6fflocalTa5d6ff"Tb4b4b4, Te6edf3limitTff7b72=T79c0ff10Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tffa657lenTb4b4b4(Te6edf3rowsTb4b4b4)Tb4b4b4, T79c0ff2Tb4b4b4)
Tff7b72for Te6edf3row Tff7b72in Te6edf3rowsTb4b4b4:
Te6edf3row Tff7b72= Tffa657dictTb4b4b4(Te6edf3rowTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertNotInTb4b4b4(Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4, Te6edf3rowTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertNotInTb4b4b4(Ta5d6ff"Ta5d6ffcontact_imageTa5d6ff"Tb4b4b4, Te6edf3rowTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ffhas_contact_imageTa5d6ff"Tb4b4b4, Te6edf3rowTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertLessEqualTb4b4b4(Tffa657lenTb4b4b4(Te6edf3rowTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4, T79c0ff240Tb4b4b4)
Tff7b72def Td2a8fftest_pagination_order_stableTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3peers Tff7b72= Tb4b4b4[Te6edf3secretsTff7b72.Td2a8fftoken_hexTb4b4b4(T79c0ff16Tb4b4b4) Tff7b72for Te6edf3_ Tff7b72in Tffa657rangeTb4b4b4(T79c0ff5Tb4b4b4)Tb4b4b4]
Tff7b72for Te6edf3iTb4b4b4, Te6edf3peer Tff7b72in Tffa657enumerateTb4b4b4(Te6edf3peersTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(
Te6edf3_messageTb4b4b4(Te6edf3peerTb4b4b4, T79c0ff10 Tff7b72- Te6edf3iTb4b4b4, Te6edf3contentTff7b72=Ta5d6fffTa5d6ff"Ta5d6ffpTffd700{Te6edf3iTffd700}Ta5d6ff"Tb4b4b4)
Tb4b4b4)
Te6edf3page1 Tff7b72= Tb4b4b4[
Tffa657dictTb4b4b4(Te6edf3rTb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffpeer_hashTa5d6ff"Tb4b4b4]
Tff7b72for Te6edf3r Tff7b72in Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8ffget_conversationsTb4b4b4(Ta5d6ff"Ta5d6fflocalTa5d6ff"Tb4b4b4, Te6edf3limitTff7b72=T79c0ff2Tb4b4b4, Te6edf3offsetTff7b72=T79c0ff0Tb4b4b4)
Tb4b4b4]
Te6edf3page2 Tff7b72= Tb4b4b4[
Tffa657dictTb4b4b4(Te6edf3rTb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffpeer_hashTa5d6ff"Tb4b4b4]
Tff7b72for Te6edf3r Tff7b72in Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8ffget_conversationsTb4b4b4(Ta5d6ff"Ta5d6fflocalTa5d6ff"Tb4b4b4, Te6edf3limitTff7b72=T79c0ff2Tb4b4b4, Te6edf3offsetTff7b72=T79c0ff2Tb4b4b4)
Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tffa657lenTb4b4b4(Te6edf3page1Tb4b4b4)Tb4b4b4, T79c0ff2Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tffa657lenTb4b4b4(Te6edf3page2Tb4b4b4)Tb4b4b4, T79c0ff2Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tffa657lenTb4b4b4(Tffa657setTb4b4b4(Te6edf3page1Tb4b4b4) Tff7b72& Tffa657setTb4b4b4(Te6edf3page2Tb4b4b4)Tb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72def Td2a8fftest_search_matches_older_messageTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3peer Tff7b72= Te6edf3secretsTff7b72.Td2a8fftoken_hexTb4b4b4(T79c0ff16Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(
Te6edf3_messageTb4b4b4(Te6edf3peerTb4b4b4, T79c0ff2Tb4b4b4, Te6edf3contentTff7b72=Ta5d6ff"Ta5d6ffneedle in a haystackTa5d6ff"Tb4b4b4, Te6edf3titleTff7b72=Ta5d6ff"Ta5d6ffoldTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(
Te6edf3_messageTb4b4b4(Te6edf3peerTb4b4b4, T79c0ff1Tb4b4b4, Te6edf3contentTff7b72=Ta5d6ff"Ta5d6fflatest onlyTa5d6ff"Tb4b4b4, Te6edf3titleTff7b72=Ta5d6ff"Ta5d6ffnewTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3rows Tff7b72= Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8ffget_conversationsTb4b4b4(Ta5d6ff"Ta5d6fflocalTa5d6ff"Tb4b4b4, Te6edf3searchTff7b72=Ta5d6ff"Ta5d6ffneedleTa5d6ff"Tb4b4b4)
Te6edf3hashes Tff7b72= Tb4b4b4{Tffa657dictTb4b4b4(Te6edf3rTb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffpeer_hashTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3r Tff7b72in Te6edf3rowsTb4b4b4}
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Te6edf3peerTb4b4b4, Te6edf3hashesTb4b4b4)
Tff7b72def Td2a8fftest_filter_failed_and_unreadTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3failed_peer Tff7b72= Te6edf3secretsTff7b72.Td2a8fftoken_hexTb4b4b4(T79c0ff16Tb4b4b4)
Te6edf3unread_peer Tff7b72= Te6edf3secretsTff7b72.Td2a8fftoken_hexTb4b4b4(T79c0ff16Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(
Te6edf3_messageTb4b4b4(Te6edf3failed_peerTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3stateTff7b72=Ta5d6ff"Ta5d6fffailedTa5d6ff"Tb4b4b4, Te6edf3contentTff7b72=Ta5d6ff"Ta5d6ffboomTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(
Te6edf3_messageTb4b4b4(Te6edf3unread_peerTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3contentTff7b72=Ta5d6ff"Ta5d6ffhiTa5d6ff"Tb4b4b4, Te6edf3is_incomingTff7b72=T79c0ff1Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3failed_rows Tff7b72= Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8ffget_conversationsTb4b4b4(Ta5d6ff"Ta5d6fflocalTa5d6ff"Tb4b4b4, Te6edf3filter_failedTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tb4b4b4{Tffa657dictTb4b4b4(Te6edf3rTb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffpeer_hashTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3r Tff7b72in Te6edf3failed_rowsTb4b4b4}Tb4b4b4, Tb4b4b4{Te6edf3failed_peerTb4b4b4}Tb4b4b4)
Te6edf3unread_rows Tff7b72= Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8ffget_conversationsTb4b4b4(Ta5d6ff"Ta5d6fflocalTa5d6ff"Tb4b4b4, Te6edf3filter_unreadTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Te6edf3unread_peerTb4b4b4, Tb4b4b4{Tffa657dictTb4b4b4(Te6edf3rTb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffpeer_hashTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3r Tff7b72in Te6edf3unread_rowsTb4b4b4}Tb4b4b4)
Tff7b72def Td2a8fftest_omit_limit_clamped_in_handlerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3peer Tff7b72= Te6edf3secretsTff7b72.Td2a8fftoken_hexTb4b4b4(T79c0ff16Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(Te6edf3_messageTb4b4b4(Te6edf3peerTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4)
Te6edf3rows Tff7b72= Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8ffget_conversationsTb4b4b4(Ta5d6ff"Ta5d6fflocalTa5d6ff"Tb4b4b4, Te6edf3limitTff7b72=Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tffa657lenTb4b4b4(Te6edf3rowsTb4b4b4)Tb4b4b4, T79c0ff1Tb4b4b4)
Te6edf3rows_capped Tff7b72= Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8ffget_conversationsTb4b4b4(Ta5d6ff"Ta5d6fflocalTa5d6ff"Tb4b4b4, Te6edf3limitTff7b72=T79c0ff99999Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tffa657lenTb4b4b4(Te6edf3rows_cappedTb4b4b4)Tb4b4b4, T79c0ff1Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────